﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class TipoDocumento
    {
        #region Enumeradores
        public enum TipoDocto
        {
            PAT = 2,
            Folha_Pagamento = 15,
            CND_ISS_ISSQN = 16,
            CND_INSS = 17,
            CND_CRF = 18,
            CND_PGFN = 19,
            DIRF = 21,
            PCMSO = 22,
            PPRA = 23,
            PSS = 24,
            CRSE = 25,
            SESMT = 26,
            RAIS = 28,
            CAGED = 29,
            INSS = 33,
            INSS_13Salario = 34,
            FGTS = 36,
            Solidariedade_Fiscal = 39,
            Notas_Fiscais_Emitidas = 40,
            Acoes_Judiciais = 43,
            Informe_Rendimentos = 48,
            Beneficios_CB = 49,
            Convencao_Coletiva = 50,
            Beneficios_CM = 51,
            Cofins = 5,
            IRRF_13 = 8,
            IRRF_Fer = 9,
            IRRF_Res = 7,
            IRRF_Sal = 6,
            ISS = 10,
            PIS_PASEP = 11,
            CSLL = 30,
            Beneficios_VT = 67,
            Beneficios_VA = 69,
            Beneficios_VR = 71,
            Beneficios_AO = 79,
            Beneficios_AC = 82
        }
        #endregion

        #region Variaveis Membros
        private int _idTipoDocumento;
        private string _descricao;
        private string _sigla;
        private string _diaPagamento;
        private string _impostoPadrao;
        private string _antPro;
        private string _workflow;
        private int _tamanhoDocumento;
        private string _url_email;
        private string _url_workflow;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdTipoDocumento
        {
            get { return _idTipoDocumento; }
            set { _idTipoDocumento = value; }
        }
        public string Descricao
        {
            get { return _descricao; }
            set { _descricao = value; }
        }
        public string Sigla
        {
            get { return _sigla; }
            set { _sigla = value; }
        }
        public string DiaPagamento
        {
            get { return _diaPagamento; }
            set { _diaPagamento = value; }
        }
        public string ImpostoPadrao
        {
            get { return _impostoPadrao; }
            set { _impostoPadrao = value; }
        }
        public string AntPro
        {
            get { return _antPro; }
            set { _antPro = value; }
        }
        public string Workflow
        {
            get { return _workflow; }
            set { _workflow = value; }
        }
        public string Url_Email
        {
            get { return _url_email; }
            set { _url_email = value; }
        }
        public string Url_WorkFlow
        {
            get { return _url_workflow; }
            set { _url_workflow = value; }
        }
        public int TamanhoDocumento
        {
            get { return _tamanhoDocumento; }
            set { _tamanhoDocumento = value; }
        }
        #endregion

        #region Construtores
        public TipoDocumento()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public TipoDocumento(int idTipoDocumento)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idTipoDocumento);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idTipoDocumento)
        {
            try
            {
                var consulta = from td in _context.tab_tipo_documento
                               where td.Id_tipo_documento == idTipoDocumento
                               select td;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idTipoDocumento = list.Id_tipo_documento;
                    this._descricao = list.descricao;
                    this._sigla = list.sigla;
                    this._diaPagamento = list.dia_pagamento;
                    this._impostoPadrao = list.imposto_padrao;
                    this._antPro = list.ant_pro;
                    this._workflow = list.workflow;
                    this._url_email = list.url_email;
                    this._url_workflow = list.url_workflow;
                    this._tamanhoDocumento = (list.tamanho_documento == null) ? 0 : int.Parse(list.tamanho_documento.ToString());
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos
        public List<TipoDocumento> SelectAll()
        {
            try
            {
                List<TipoDocumento> listTipoDocumento = new List<TipoDocumento>();

                var consulta = from td in _context.tab_tipo_documento
                               select td;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    TipoDocumento tipoDocumento = new TipoDocumento();
                    tipoDocumento.IdTipoDocumento = list.Id_tipo_documento;
                    tipoDocumento.Descricao = list.descricao;
                    tipoDocumento.DiaPagamento = list.dia_pagamento;
                    tipoDocumento.ImpostoPadrao = list.imposto_padrao;
                    tipoDocumento.AntPro = list.ant_pro;
                    tipoDocumento.Workflow = list.workflow;
                    tipoDocumento.TamanhoDocumento = (list.tamanho_documento == null) ? 0 : int.Parse(list.tamanho_documento.ToString());

                    listTipoDocumento.Add(tipoDocumento);
                }

                return listTipoDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<TipoDocumento> SelectPorProcesso(int idTipoProcesso)
        {
            try
            {
                List<TipoDocumento> listTipoDocumento = new List<TipoDocumento>();

                var consulta = from td in _context.tab_tipo_documento
                               join tp in _context.tab_tipo_documento_processo on td.Id_tipo_documento equals tp.tab_tipo_documento.Id_tipo_documento
                               where tp.tab_tipo_processo.id_tipo_processo == idTipoProcesso
                               select td;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    TipoDocumento tipoDocumento = new TipoDocumento();
                    tipoDocumento.IdTipoDocumento = list.Id_tipo_documento;
                    tipoDocumento.Descricao = list.descricao;
                    tipoDocumento.DiaPagamento = list.dia_pagamento;
                    tipoDocumento.ImpostoPadrao = list.imposto_padrao;
                    tipoDocumento.AntPro = list.ant_pro;
                    tipoDocumento.Workflow = list.workflow;
                    tipoDocumento.TamanhoDocumento = (list.tamanho_documento == null) ? 0 : int.Parse(list.tamanho_documento.ToString());

                    listTipoDocumento.Add(tipoDocumento);
                }

                return listTipoDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public string ObterCaminhoDocumento(string pCaminhoFisico, TipoDocto pTipoDocumento)
        {
            try
            {
                string _caminhodocumento = pCaminhoFisico + @"\Empresas\Documentos\" + pTipoDocumento.GetHashCode().ToString();

                if (!Directory.Exists(_caminhodocumento))
                {
                    Directory.CreateDirectory(_caminhodocumento);
                }

                return _caminhodocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string ObterNomeDocumento(string pNomeArquivo, int pIdOrganizacao, TipoDocto pTipoDocumento)
        {
            try
            {
                string _nomedocumento = "";
                DirectoryInfo _dirinfo = new DirectoryInfo(pNomeArquivo);

                string[] _documento = pNomeArquivo.Split('\\');
                int _tamanhoarr = _documento.Length - 1;

                _documento[_tamanhoarr] = pIdOrganizacao.ToString() + "_" + pTipoDocumento.GetHashCode().ToString() + _dirinfo.Extension;
                _nomedocumento = _documento[_tamanhoarr];

                return _nomedocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string ObterNomeDocumento(string pNomeArquivo, int pIdOrganizacao, TipoDocto pTipoDocumento, string pComplemento)
        {
            try
            {
                string _nomedocumento = "";
                DirectoryInfo _dirinfo = new DirectoryInfo(pNomeArquivo);

                string[] _documento = pNomeArquivo.Split('\\');
                int _tamanhoarr = _documento.Length - 1;

                _documento[_tamanhoarr] = pIdOrganizacao.ToString() + "_" + pTipoDocumento.GetHashCode().ToString() + "_" + pComplemento.ToString() + _dirinfo.Extension;
                _nomedocumento = _documento[_tamanhoarr];

                return _nomedocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string ObterNomeDocumento(int pIdOrganizacao, TipoDocto pTipoDocumento, string pComplemento)
        {
            try
            {
                string _nomedocumento = "";
                
                _nomedocumento = pIdOrganizacao.ToString() + "_" + pTipoDocumento.GetHashCode().ToString() + "_" + pComplemento.ToString() + ".pdf";

                return _nomedocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string ObterNomeDocumento(int pIdOrganizacao, int pTipoDocumento, string pComplemento)
        {
            try
            {
                string _nomedocumento = "";

                _nomedocumento = pIdOrganizacao.ToString() + "_" + pTipoDocumento.ToString() + "_" + pComplemento.ToString() + ".pdf";

                return _nomedocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}
